import { Injectable } from '@nestjs/common';
import { ConfigService as NestConfigService } from '@nestjs/config';
import { ConfigPath, GetConfigType } from './config.types';

@Injectable()
export class TypedConfigService {
  constructor(private readonly configService: NestConfigService) {}

  /**
   * 获取配置值的类型安全方法
   * @param path 配置路径
   * @param defaultValue 默认值
   * @returns 配置值
   */
  get<T extends ConfigPath>(path: T): GetConfigType<T>;
  get<T extends ConfigPath>(path: T, defaultValue: GetConfigType<T>): GetConfigType<T>;
  get<T extends ConfigPath>(path: T, defaultValue?: GetConfigType<T>): GetConfigType<T> {
    return this.configService.get(path, defaultValue) as GetConfigType<T>;
  }

  /**
   * 获取必需的配置值，如果不存在则抛出错误
   * @param path 配置路径
   * @returns 配置值
   */
  getOrThrow<T extends ConfigPath>(path: T): GetConfigType<T> {
    return this.configService.getOrThrow(path) as GetConfigType<T>;
  }

  /**
   * 检查配置值是否存在
   * @param path 配置路径
   * @returns 是否存在
   */
  has(path: ConfigPath): boolean {
    return this.configService.get(path) !== undefined;
  }

  /**
   * 获取原始 ConfigService 实例（用于不在类型定义中的配置）
   */
  getRaw(): NestConfigService {
    return this.configService;
  }
}
